home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / pack / imploder / imp_implode.s < prev    next >
Text File  |  1980-01-03  |  9KB  |  569 lines

  1.  
  2. HeaderID    =    "IMP!"
  3.  
  4. test:        lea    src,a0        ;src buffer
  5.         move.l    #len,d0        ;src length
  6.         moveq    #11,d1        ;packmode : 0-11
  7.         bsr    IMP_Pack
  8.         rts
  9.  
  10. ******************************************************************************
  11. * IMP-Implode
  12. * -----------
  13. * In:    a0.l=*buffer
  14. *    d0.l=data length
  15. *    d1.l=crunch mode
  16. *
  17. * Out:    d0.l=<>0:crunched length
  18. ******************************************************************************
  19.  
  20.         cnop    0,4
  21. IMP_Pack:    movem.l    d2-d7/a2-a6,-(sp)
  22.  
  23.         moveq    #88-1,d2
  24. IMP01:        clr.w    -(sp)
  25.         dbf    d2,IMP01
  26.         move.l    sp,a6
  27.  
  28.         cmp.l    #$40,d0
  29.         blo    IMP23
  30.  
  31.         scs    (a6)
  32.         move.l    a0,10(a6)
  33.         move.l    a0,$22(a6)
  34.         move.l    a0,$26(a6)
  35.         move.l    d0,$12(a6)
  36.         add.l    d0,a0
  37.         move.l    a0,14(a6)
  38.         lea    IMPtab0(pc),a0
  39.         lsl.w    #2,d1
  40.         move.l    0(a0,d1.w),d1
  41.         addq.l    #1,d1
  42.         cmp.l    d0,d1
  43.         bls.s    IMP03
  44.  
  45.         move.l    d0,d1
  46.         subq.l    #1,d1
  47. IMP03:        move.l    d1,$1A(a6)
  48.         subq.l    #1,d1
  49.         moveq    #0,d0
  50. IMP04:        cmp.l    (a0)+,d1
  51.         bls.s    IMP05
  52.         addq.b    #1,d0
  53.         bra.s    IMP04
  54.  
  55. IMP05:        move.b    d0,1(a6)
  56.         lea    $A4(a6),a1
  57.         moveq    #12,d1
  58.         mulu    d1,d0
  59.         lea    IMPtab1(pc),a0
  60.         add.l    d0,a0
  61.         subq.w    #1,d1
  62. IMP06:        move.b    (a0)+,(a1)+
  63.         dbf    d1,IMP06
  64.  
  65.         lea    $74(a6),a1
  66.         lea    $A4(a6),a0
  67.         moveq    #12-1,d1
  68. IMP07:        move.b    (a0)+,d0
  69.         moveq    #0,d2
  70.         bset    d0,d2
  71.         move.l    d2,(a1)+
  72.         dbf    d1,IMP07
  73.  
  74.         lea    $74(a6),a0
  75.         lea    $84(a6),a1
  76.         moveq    #8-1,d1
  77. IMP08:        move.l    (a0)+,d0
  78.         add.l    d0,(a1)+
  79.         dbf    d1,IMP08
  80.  
  81.         tst.b    (a6)
  82.         beq.s    IMP11
  83.  
  84.         lea    $74(a6),a1
  85.         moveq    #8-1,d0
  86. IMP09:        move.l    (a1)+,d1
  87.         move.w    d1,(a2)+
  88.         dbf    d0,IMP09
  89.  
  90.         lea    $A4(a6),a1
  91.         moveq    #12-1,d0
  92. IMP10:        move.b    (a1)+,(a2)+
  93.         dbf    d0,IMP10
  94.  
  95. IMP11:        move.b    #7,$2D(a6)
  96. IMP12:
  97.         bsr    IMP28
  98.         beq.s    IMP15
  99.  
  100.         bsr    IMP55
  101.         bne.s    IMP13
  102.  
  103.         lea $1e(a6),a5
  104.         addq.l #1,(a5)+        ;$1e
  105.         move.l (a5),a0        ;$22
  106.         addq.l #1,(a5)+        ;$22
  107.         move.l (a5),a1        ;$26
  108.         move.b (a0),(a1)
  109.         addq.l #1,(a5)        ;$26
  110.         addq.l #1,$30(a6)    ;$30    
  111.  
  112.         cmp.l #$4012,$30(a6)
  113.         blo.s    IMP12
  114.         bra.s    IMP15
  115.  
  116. IMP13:        move.b    $5C(a6),d0
  117.         move.l    $60(a6),d1
  118.         bsr    IMP37
  119.         move.b    $5E(a6),d0
  120.         move.w    $66(a6),d1
  121.         bsr    IMP37
  122.         move.b    $5D(a6),d0
  123.         move.w    $64(a6),d1
  124.         cmp.b    #13,d0
  125.         bne.s    IMP14
  126.         move.l    $26(a6),a0
  127.         move.b    d1,(a0)+
  128.         move.l    a0,$26(a6)
  129.         moveq    #5,d0
  130.         moveq    #$1F,d1
  131.  
  132. IMP14:        bsr    IMP37
  133.         moveq    #0,d0
  134.         move.l d0,$30(a6)    ;clr.l    $30(a6)
  135.         move.b    $2E(a6),d0
  136.         add.l    d0,$22(a6)
  137.         bra    IMP12
  138.  
  139.         cnop    0,4
  140. IMP15:        lea $1e(a6),a5
  141.         addq.l #1,(a5)+        ;$1e
  142.         move.l (a5),a0        ;$22
  143.         addq.l #1,(a5)        ;$22
  144.         move.l (a5)+,d0        ;$22
  145.         move.l (a5),a1        ;$26
  146.         move.b (a0),(a1)
  147.         addq.l #1,(a5)        ;$26
  148.         addq.l #1,$30(a6)    ;$30
  149.  
  150.         cmp.l    14(a6),d0
  151.         bne.s    IMP15
  152.  
  153.         tst.b    (a6)
  154.         bne    IMP19
  155.         move.l    $26(a6),d0
  156.         sub.l    10(a6),d0
  157.         moveq    #12,d1
  158.         cmp.l    d1,d0        ;cmp.l #12,d0
  159.         blo    IMP23
  160.  
  161.         move.l    $12(a6),d1
  162.         sub.l    d0,d1
  163.         moveq    #$36,d7
  164.         cmp.l    d7,d1        ;cmp.l    #$36,d1
  165.         bls    IMP23
  166.         move.l    10(a6),a1
  167.         move.l    $26(a6),a0
  168.         move.w    #$ff00,d7    ;move.l    #$FF00,d7
  169.         btst    #0,d0
  170.         beq.s    IMP16
  171.         moveq    #0,d7
  172.         addq.l    #1,d0
  173.         clr.b    (a0)+
  174. IMP16:        move.l    (a1),8(a0)
  175.         move.l    #HeaderID,(a1)
  176.         move.l    4(a1),4(a0)
  177.         move.l    $12(a6),4(a1)
  178.         move.l    8(a1),(a0)
  179.         move.l    d0,8(a1)
  180.         moveq    #$2e,d1
  181.         add.l    d1,d0        ;add.l    #$2E,d0
  182.         move.l    d0,$16(a6)
  183.         move.l    $30(a6),12(a0)
  184.         move.b    $2C(a6),d1
  185.         and.w    #$FE,d1
  186.         move.b    $2D(a6),d0
  187.         bset    d0,d1
  188.         or.w    d7,d1
  189.         move.w    d1,$10(a0)
  190.  
  191.         lea    $74(a6),a1
  192.         lea    $12(a0),a0
  193.         moveq    #8-1,d0
  194. IMP17:        move.l    (a1)+,d1
  195.         move.w    d1,(a0)+
  196.         dbf    d0,IMP17
  197.  
  198.         lea    $A4(a6),a1
  199.         moveq    #12-1,d0
  200. IMP18:        move.b    (a1)+,(a0)+
  201.         dbf    d0,IMP18
  202.         bra.s    IMP23
  203.  
  204.         cnop    0,4
  205. IMP19:        move.l    $26(a6),d0
  206.         sub.l    10(a6),d0
  207.         move.l    $12(a6),d1
  208.         sub.l    d0,d1
  209.         moveq #6,d2
  210.         cmp.l d2,d1        ;cmp.l    #6,d1
  211.         bls.s    IMP23
  212.  
  213.         move.b    $2C(a6),d1
  214.         and.b    #$FE,d1
  215.         move.b    $2D(a6),d2
  216.         bset    d2,d1
  217.         move.l    $26(a6),a0
  218.         btst    #0,d0
  219.         beq.s    IMP20
  220.         move.b    d1,(a0)+
  221.         move.l    $30(a6),(a0)
  222.         bra.s    IMP21
  223.  
  224.         cnop    0,4
  225. IMP20:        move.l    $30(a6),(a0)+
  226.         move.b    d1,(a0)
  227. IMP21:        addq.l    #5,d0
  228.         move.l    d0,$16(a6)
  229.         bra.s    IMP23
  230.  
  231. IMP22:        moveq    #-1,d0
  232.         bra.s    IMP24
  233.  
  234.         cnop    0,4
  235. IMP23:        move.l    $16(a6),d0
  236. IMP24:        moveq    #88-1,d2
  237. IMP25:        clr.w    (sp)+
  238.         dbf    d2,IMP25
  239.  
  240.         movem.l    (sp)+,d2-d7/a2-a6
  241.         tst.l    d0
  242.         rts
  243.  
  244. IMPtab0:    dc.l    128
  245.         dc.l    256
  246.         dc.l    512
  247.         dc.l    1024
  248.         dc.l    1792
  249.         dc.l    3328
  250.         dc.l    5376
  251.         dc.l    9472
  252.         dc.l    20736
  253.         dc.l    37376
  254.         dc.l    67840
  255.         dc.l    67840
  256.  
  257. IMPtab1:    dc.l    $5050505,$5050505,$6060606,$5060707,$6060606,$7070606
  258.         dc.l    $5060707,$7070707,$8080808,$5060708,$7070808,$8080909
  259.         dc.l    $6070708,$7080909,$8090A0A,$6070708,$709090A,$80A0B0B
  260.         dc.l    $6070808,$709090A,$80A0B0C,$6070808,$709090A,$90A0C0D
  261.         dc.l    $6070708,$709090C,$90A0C0E,$6070809,$7090A0C,$90B0D0F
  262.         dc.l    $6070808,$70A0B0B,$90C0D10,$6080809,$70B0C0C,$90D0E11
  263.  
  264. IMPtab2:    dc.l    $2060E,$1020304
  265.  
  266. IMPtab3:    dc.l    $1010101,$2030304,$405070E
  267.  
  268. IMPtab4:    dc.l    $20002
  269.         dc.l    $20002
  270.         dc.l    $6000A
  271.         dc.l    $A0012
  272.         dc.l    $16002A
  273.         dc.l    $8A4012
  274.  
  275.         cnop    0,4
  276. IMP28:        move.l    $22(a6),a5
  277.         move.l    14(a6),d4
  278.         move.l    a5,d0
  279.         addq.l    #1,d0
  280.         add.l    $1A(a6),d0
  281.         cmp.l    d4,d0
  282.         bls.s    IMP29
  283.         move.l    d4,d0
  284.         move.l    d0,d1
  285.         sub.l    a5,d1
  286.         cmp.l    #3,d1
  287.         bcc.s    IMP29
  288.         moveq    #0,d0
  289.         rts
  290.  
  291.         cnop    0,4
  292. IMP29:        move.l    d0,d5
  293.         move.l    a5,a2
  294.         addq.l    #1,a2
  295.         move.l    a2,a4
  296.         moveq    #1,d7
  297.         move.b    (a5),d3
  298.  
  299.         lea    $34(a6),a3
  300. IMP30:        cmp.b    (a2)+,d3
  301.         beq.s    IMP32
  302.         cmp.b    (a2)+,d3
  303.         beq.s    IMP32
  304.         cmp.b    (a2)+,d3
  305.         beq.s    IMP32
  306.         cmp.b    (a2)+,d3
  307.         beq.s    IMP32
  308.         cmp.b    (a2)+,d3
  309.         beq.s    IMP32
  310.         cmp.b    (a2)+,d3
  311.         beq.s    IMP32
  312.         cmp.b    (a2)+,d3
  313.         beq.s    IMP32
  314.         cmp.b    (a2)+,d3
  315.         beq.s    IMP32
  316.         cmp.b    (a2)+,d3
  317.         beq.s    IMP32
  318.         cmp.b    (a2)+,d3
  319.         beq.s    IMP32
  320.         cmp.b    (a2)+,d3
  321.         beq.s    IMP32
  322.         cmp.b    (a2)+,d3
  323.         beq.s    IMP32
  324.         cmp.b    (a2)+,d3
  325.         beq.s    IMP32
  326.         cmp.b    (a2)+,d3
  327.         beq.s    IMP32
  328.         cmp.b    (a2)+,d3
  329.         beq.s    IMP32
  330.         cmp.b    (a2)+,d3
  331.         beq.s    IMP32
  332.         cmp.l    a2,d5
  333.         bhi.s    IMP30
  334.  
  335. IMP31:        moveq    #-1,d0
  336.         rts
  337.  
  338.         cnop    0,4
  339. IMP32:        cmp.l    a2,d5
  340.         bls.s    IMP31
  341.         move.l    a4,a0
  342.         move.l    a2,a1
  343.         cmpm.b    (a0)+,(a1)+
  344.         bne.s    IMP30
  345.         cmpm.b    (a0)+,(a1)+
  346.         bne.s    IMP35
  347.         cmpm.b    (a0)+,(a1)+
  348.         bne.s    IMP34
  349.  
  350.         move.w    #252-1,d0
  351. IMP33:        cmpm.b    (a0)+,(a1)+
  352.         dbne    d0,IMP33
  353.  
  354. IMP34:        cmp.l    d4,a1
  355.         bls.s    IMP35
  356.         move.l    d4,a1
  357.  
  358. IMP35:        move.l    a1,d6
  359.         sub.l    a2,d6
  360.         cmp.w    d6,d7
  361.         bcc.s    IMP30
  362.         move.w    d6,d7
  363.         cmp.w    #8,d6
  364.         bhi.s    IMP36
  365.         tst.b    -2(a3,d6.w)
  366.         bne    IMP30
  367.         move.b    d6,-2(a3,d6.w)
  368.         move.l    a2,d0
  369.         sub.l    a5,d0
  370.         subq.l    #2,d0
  371.         move.w    d6,d1
  372.     move.w    d1,$dff180
  373. ;        lsl.w    #2,d1
  374.         move.l    d0,0(a3,d1.w*4)            ;`020
  375.         bra    IMP30
  376.  
  377.         cnop    0,4
  378. IMP36:        move.b    d6,7(a3)
  379.         move.l    a2,d0
  380.         sub.l    a5,d0
  381.         subq.l    #2,d0
  382.         move.l    d0,$24(a3)
  383.         cmp.b    #$FF,d6
  384.         bne    IMP30
  385.         bra.s    IMP31
  386.  
  387.         cnop    0,4
  388. IMP37:        move.b    $2C(a6),d2
  389.         move.b    $2D(a6),d3
  390.         move.l    $26(a6),a0
  391. IMP38:        lsr.l    #1,d1
  392.         roxr.b    #1,d2
  393.         subq.b    #1,d3
  394.         bpl.s    IMP39
  395.         moveq    #7,d3
  396.         move.b    d2,(a0)+
  397.         moveq    #0,d2
  398. IMP39:        subq.b    #1,d0
  399.         bne.s    IMP38
  400.         move.l    a0,$26(a6)
  401.         move.b    d3,$2D(a6)
  402.         move.b    d2,$2C(a6)
  403.         rts
  404.  
  405.         cnop    0,4
  406. IMP40:        and.l    #$FF,d0
  407.         cmp.b    #13,d0
  408.         bhi.s    IMP42
  409.         cmp.b    #5,d0
  410.         bhi.s    IMP41
  411.         lea    IMPtab2(pc),a0
  412.         move.b    -2(a0,d0.w),$71(a6)
  413.         move.b    2(a0,d0.w),$69(a6)
  414.         bra.s    IMP44
  415.  
  416.         cnop    0,4
  417. IMP41:        subq.b    #6,d0
  418.         or.b    #$F0,d0
  419.         move.b    d0,$71(a6)
  420.         move.b    #8,$69(a6)
  421.         bra.s    IMP43
  422.  
  423.         cnop    0,4
  424. IMP42:        move.b    #$1F,$70(a6)
  425.         move.b    d0,$71(a6)
  426.         move.b    #13,$69(a6)
  427. IMP43:        moveq    #5,d0
  428. IMP44:        subq.b    #2,d0
  429.         move.l    $30(a6),d2
  430.         lea    IMPtab3(pc),a1
  431.         lea    IMPtab4(pc),a0
  432.         add.l    d0,a0
  433.         add.l    d0,a0
  434.         cmp.w    (a0),d2
  435.         bcc.s    IMP45
  436.         move.b    0(a1,d0.w),d6
  437.         move.b    d6,d3
  438.         addq.b    #1,d3
  439.         sf $73(a6)        ;move.b    #0,$73(a6)
  440.         moveq    #0,d4
  441.         bra.s    IMP48
  442.  
  443.         cnop    0,4
  444. IMP45:        cmp.w    8(a0),d2
  445.         bcc.s    IMP46
  446.         move.b    4(a1,d0.w),d6
  447.         move.b    d6,d3
  448.         addq.b    #2,d3
  449.         move.b    #2,$73(a6)
  450.         move.w    (a0),d4
  451.         bra.s    IMP48
  452.  
  453.         cnop    0,4
  454. IMP46:        cmp.w    $10(a0),d2
  455.         blo.s    IMP47
  456.         moveq    #0,d0
  457.         rts
  458.  
  459.         cnop    0,4
  460. IMP47:        move.b    8(a1,d0.w),d6
  461.         move.b    d6,d3
  462.         addq.b    #2,d3
  463.         move.b    #3,$73(a6)
  464.         move.w    8(a0),d4
  465. IMP48:        move.b    d3,$6A(a6)
  466.         sub.w    d4,d2
  467.         moveq    #$10,d5
  468.         sub.b    d6,d5
  469.         lsl.w    d5,d2
  470. IMP49:        add.w    d2,d2
  471.         roxl    $72(a6)
  472.         subq.b    #1,d6
  473.         bne.s    IMP49
  474.         lea    $A4(a6),a1
  475.         lea    $74(a6),a0
  476.         add.w    d0,a0
  477.         add.w    d0,a0
  478.         add.w    d0,a0
  479.         add.w    d0,a0
  480.  
  481.         cmp.l    (a0),d1
  482.         bcc.s    IMP50
  483.         move.b    0(a1,d0.w),d6
  484.         move.b    d6,d3
  485.         addq.b    #1,d3
  486.         moveq    #0,d7
  487.         move.l    d7,d4
  488.         bra.s    IMP53
  489. IMP50:        cmp.l    $10(a0),d1
  490.         bcc.s    IMP51
  491.         move.b    4(a1,d0.w),d6
  492.         move.b    d6,d3
  493.         addq.b    #2,d3
  494.         moveq    #2,d7
  495.         move.l    (a0),d4
  496.         bra.s    IMP53
  497. IMP51:        cmp.l    $20(a0),d1
  498.         blo.s    IMP52
  499.         moveq    #0,d0
  500.         rts
  501.  
  502.         cnop    0,4
  503. IMP52:        move.b    8(a1,d0.w),d6
  504.         move.b    d6,d3
  505.         addq.b    #2,d3
  506.         moveq    #3,d7
  507.         move.l    $10(a0),d4
  508. IMP53:        move.b    d3,$68(a6)
  509.         sub.l    d4,d1
  510.         moveq    #$20,d5
  511.         sub.b    d6,d5
  512.         lsl.l    d5,d1
  513. IMP54:        add.l    d1,d1
  514.         addx.l    d7,d7
  515.         subq.b    #1,d6
  516.         bne.s    IMP54
  517.         move.l    d7,$6C(a6)
  518.  
  519.         moveq    #-1,d0
  520.         rts
  521.  
  522.         cnop    0,4
  523. IMP55:        clr.w    $2A(a6)
  524.         clr.b    $2E(a6)
  525.         lea    $34(a6),a4
  526.         lea    $3C(a6),a5
  527. IMP56:        move.l    (a5)+,d1
  528.         move.b    (a4)+,d0
  529.         beq.s    IMP58
  530.  
  531.         bsr    IMP40
  532.         beq.s    IMP58
  533.  
  534.         moveq    #0,d0
  535.         moveq    #0,d1
  536.         move.b    -1(a4),d0
  537.         lsl.w    #3,d0
  538.         add.b    $69(a6),d1
  539.         add.b    $68(a6),d1
  540.         add.b    $6A(a6),d1
  541.         sub.w    d1,d0
  542.         bmi.s    IMP58
  543.  
  544.         cmp.w    $2A(a6),d0
  545.         blo.s    IMP58
  546.         move.w    d0,$2A(a6)
  547.         move.b    -1(a4),$2E(a6)
  548.  
  549.         lea    $5C(a6),a0
  550.         lea    $68(a6),a1
  551.         moveq    #13-1,d1
  552. IMP57:        move.b    (a1)+,(a0)+
  553.         dbf    d1,IMP57
  554.  
  555. IMP58:        move.l    a4,d0
  556.         sub.l    a6,d0
  557.         cmp.w    #$3C,d0
  558.         bne.s    IMP56
  559.         clr.l    -(a4)
  560.         clr.l    -(a4)
  561.         tst.w    $2E(a6)
  562.         rts
  563.  
  564. src:    incbin    'sys:IMP.s'
  565. srcend:
  566.  
  567. len    =    srcend-src
  568.  
  569.